import requests
from api import log
from api.api_rechange import ApiRechange
from api.api_register_login import ApiRegisterLogin
from tools import html_parser, com_assert


class TestRechange:
    """充值功能测试类

    包含两个测试用例：
    1. 验证码接口测试
    2. 充值流程测试（包含后台充值和三方充值）
    """

    def setup(self):
        """测试前置方法（每个测试方法执行前调用）

        功能：
        1. 创建并初始化会话对象
        2. 实例化充值接口对象
        3. 执行登录操作
        """
        # 创建会话对象（保持登录状态）
        self.session = requests.session()

        # 实例化充值接口对象（通过会话对象共享cookies）
        self.api = ApiRechange(self.session)

        # 执行登录操作（使用预置账号）
        # keyword参数可能是手机号或用户名
        # password参数是登录密码
        ApiRegisterLogin(self.session).api_login(
            keyword="123456789710",  # 测试账号
            password="123456"  # 测试密码
        )

    def teardown(self):
        """测试后置方法（每个测试方法执行后调用）

        功能：
        1. 关闭会话，释放资源
        """
        # 关闭会话，释放资源
        self.session.close()

    def test01_img_code(self, random):
        """测试验证码接口

        参数:
            random: 随机数，用于生成验证码请求的独特标识
            防止浏览器缓存验证码图片

        功能：
        1. 调用验证码接口获取图片验证码
        2. 记录接口响应状态码
        """
        try:
            # 调用验证码接口
            # 传入随机数参数，确保每次请求都是新的验证码
            result = self.api.api_img_code(random)

            # 打印状态码（调试用）
            print(result.status_code)

            # 记录接口响应状态码
            # 通常验证码接口返回200表示成功
            log.info("充值验证码接口执行状态码为：{}".format(result.status_code))

        except Exception as e:
            # 捕获并记录异常
            log.error(e)
            # 重新抛出异常，使测试失败
            raise

    def test02_rechange(self, expect_json="ok"):
        """测试完整充值流程（包含后台充值和三方充值）

        参数:
            expect_json: 预期响应结果的JSON数据，默认为"ok"

        功能：
        1. 获取验证码
        2. 调用后台充值接口
        3. 解析返回的HTML表单
        4. 提交表单到三方充值接口
        5. 验证最终结果
        """
        try:
            # 1. 获取验证码（这里使用固定值123123作为随机数）
            # 实际项目中应使用动态生成的随机数
            self.api.api_img_code(123123)

            # 2. 调用后台充值接口
            # 该接口返回包含HTML表单的响应
            result = self.api.api_rechange()

            # 打印后台充值响应内容（调试用）
            print(result.json())

            # 记录后台充值接口响应结果
            log.info("后台充值接口执行结果为：{}".format(result.json()))

            # 3. 解析返回的HTML表单
            # 使用html_parser工具解析响应中的HTML表单
            # 返回值为元组 (url, data)
            # url: 表单提交的目标URL
            # data: 表单数据字典
            data = html_parser(result)

            # 4. 提交表单到三方充值接口
            # 使用解析出的URL和表单数据提交
            # 这里模拟浏览器提交表单
            result1 = self.session.post(url=data[0], data=data[1])

            # 记录三方充值接口响应结果
            log.info("三方充值接口执行结果为：{}".format(result1.json()))

            # 5. 断言验证三方充值结果
            # 使用com_assert工具验证响应是否符合预期
            com_assert(result, expect_json=expect_json)

        except Exception as e:
            # 捕获并记录异常
            log.error(e)

            # 重新抛出异常，使测试失败
            raise